<?php
	class Laudo{
		/*
		 Método que tem por finalidade executar todas as SQLs
		 retorna um array, um resource ou false; 
		 */
		private function execute($sql, $associar = false){
			$values = false; 
			require_once 'Connect.php';
			$con = Connect::getInstance();
			$res = $con->query($sql);
			if ($associar){
				if ($res){
					$values = $con->fetch($res);
				}
			}else {
				$values = $res;
			}
			return $values;
		}
		/*
		 * Método que tem por finalidade listar linhas do banco sem nenhuma condição
		 * retorna um array ou false
		 */
		private function listarSimples($colums, $table = 'laudos'){
			$sql = "SELECT $colums FROM $table inner join secretarias on laudos.secretaria = secretarias.idsecretaria INNER JOIN funcionarios ON laudos.funcionario = funcionarios.idfuncionario";
			return $this->execute($sql,true);
		}
		/*
		 * Método que tem por finalidade listar linhas do banco com condição
		 * retorna um array ou false
		 */
		private function listarCondicao($colums,$condicao,$value,$table ='laudos'){
			$sql = "SELECT $colums FROM $table inner join secretarias on laudos.secretaria = secretarias.idsecretaria INNER JOIN funcionarios ON laudos.funcionario = funcionarios.idfuncionario WHERE $condicao = $value";
			return $this->execute($sql, true);
		}
		/*
		 * Método que tem por finalidade validar campos antes da inserção no banco
		 * retorna um array
		 */
		private function validar($values){
			foreach ($values as $key => $value){
				if ($value !='null' && !(preg_match('/^[0-9]+$/', $value) === 1))
					$values[$key] = "'$value'";
			}
			return $values;	
		}
		/*
		 * Método que tem por finalidade listar todas as linhas da tabela laudos
		 * retorna um array ou false
		 */
		public function listarTudo(){
			$colums = '*';
			return $this->listarSimples($colums);
		}
		/*
		 * Método que tem por finalidade listar as linhas da tabela laudos
		 * atraves da coluna setor
		 * retorna um array ou false
		 */
		public function listarPorSetor($setor){
			$colums = "*";
			$condicao = 'setor';
			return $this->listarCondicao($colums, $condicao, $setor);
		}
		/*
		 * Método que tem por finalidade listar todas as linhas da tabela laudos
		 * através da coluna número
		 * retorna um array ou false
		 */
		public function listarPorNumero($numero){
			$colums = '*';
			$condicao = 'numero';
			return $this->listarCondicao($colums, $condicao, $numero);
		}
		/*
		 * Método que tem por finalidade listar todos os laudos de uma secretaria
		 * retorna um array ou false
		 */
		public function listarPorSecretaria($secretaria){
			$values = false;
			$sql = "SELECT idsecretaria FROM secretarias WHERE sigla = '$secretaria'";
			$sec = $this->execute($sql,true);
			if($sec){
				$colums = '*';
				$condicao = 'secretaria';
				$values = $this->listarCondicao($colums, $condicao, $sec['idsecretaria']);
			}
			return $values;
		}
		/*
		 * Método que tem por finalidade inserir dados na tabela laudos
		 * retorna um resource ou false
		 */
		public function insert($elements){
			$elements = $this->validar($elements);
			$values = implode(',', $elements);
			$campos = array_keys($elements);
			$sql = "INSERT INTO laudos($campos) values($values)";
			return $this->execute($sql);
		}
		/*
		 * Método que tem por finalidade listar a linha com o numero máximo
		 * retorna um array ou false
		 */
		public function numeroMax(){
			$colums = 'MAX(numero) as max';
			return $this->listarSimples($colums);
		}
	}